#ifndef __WIZ_ALGEBRA_QUATERNION_BASE_HPP__SHANHAOBO_19800429__
#define __WIZ_ALGEBRA_QUATERNION_BASE_HPP__SHANHAOBO_19800429__

namespace Wiz
{
    namespace Quat
    {
#pragma pack(push, 1)
        namespace Base
        {
            template<typename ElementT>
            struct Type
            {
                WIZ_DECLARE_CLASS_THIS(Type);
                ////////////////////////////////////////////////////////////////
                typedef ElementT                tElement;
                typedef tElement                tXYZElement[3];
                typedef tElement                tElementArray[4];
                ////////////////////////////////////////////////////////////////
                union
                {
                    ////////////////////////////////////////////////////////////
                    struct 
                    {
                        tElement              w;
                        union
                        {
                            struct 
                            {
                                tElement      x, y, z;
                            };
                            struct
                            {
                                tXYZElement   xyz;
                            };
                        };
                    };
                    ////////////////////////////////////////////////////////////

                    ////////////////////////////////////////////////////////////
                    struct 
                    {
                        tElementArray         e;
                    };
                    ////////////////////////////////////////////////////////////
                }; 
                ////////////////////////////////////////////////////////////

                ////////////////////////////////////////////////////////////////
                Type()
                {
                }
                Type(const tElement& InW, const tElement& InX, const tElement& InY, const tElement& InZ)
                {
                    this->w = InW;
                    this->x = InX;
                    this->y = InY;
                    this->z = InZ;
                }
                Type(const tElement& InEle) 
                {
                    this->w = InEle;
                    this->x = InEle;
                    this->y = InEle;
                    this->z = InEle;
                }
                Type(tThisIn InOther)
                {
                    this->w = InOther.w;
                    this->x = InOther.x;
                    this->y = InOther.y;
                    this->z = InOther.z;
                }
            };
        } /// end of namespace Base
#pragma pack(pop)
    } /// end of namespace Quat
} /// end of namespace Wiz

#endif /*__WIZ_ALGEBRA_QUATERNION_BASE_HPP__SHANHAOBO_19800429__*/
